/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.invoice.model.dao;
import com.invoice.busines.dto.CategoriaDTO;
import com.invoice.busines.dto.SubcategoriaDTO;
import com.invoice.exceptions.InvoiceException;
import com.invoice.model.entities.Subcategoria;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;

/**
 *
 * @author meliMeli
 */
public class SubcategoriaDAOHibernate extends DAOGenerico implements SubcategoriaDAO{
CategoriaDAOHibernate categoriaDAO= new CategoriaDAOHibernate();
   
@Override
    public Subcategoria convertDTOtoPojo(Object object) {
        SubcategoriaDTO subcategoriaDTO = (SubcategoriaDTO)object;
        Subcategoria subcategoria = new Subcategoria();
        
        subcategoria.setIdSubCateg(subcategoriaDTO.getIdSubcategoria());
        subcategoria.setNombre(subcategoriaDTO.getNombre());
        subcategoria.setDescripcion(subcategoriaDTO.getDescripcion());
        if(subcategoriaDTO.getCategoriaDTO() != null){
            subcategoria.setCategoria(categoriaDAO.convertDTOtoPojo(subcategoriaDTO.getCategoriaDTO()));
        }
        return subcategoria;
    }
    
    @Override
    public SubcategoriaDTO convertPojotoDTO(Object object) {
        Subcategoria subcategoria = (Subcategoria)object;
        SubcategoriaDTO subcategoriaDTO = new SubcategoriaDTO();
        if (object == null) {
            return null;
        }
        subcategoriaDTO.setIdSubcategoria(subcategoria.getIdSubCateg());
        subcategoriaDTO.setDescripcion(subcategoria.getDescripcion());
        subcategoriaDTO.setNombre(subcategoria.getNombre());
        subcategoriaDTO.setCategoriaDTO((CategoriaDTO) categoriaDAO.convertPojotoDTO(subcategoria.getCategoria()));
         return subcategoriaDTO;
        
    }
    
    
        @Override
    public List<SubcategoriaDTO> findAll() throws InvoiceException {
        List<SubcategoriaDTO> result = new ArrayList<SubcategoriaDTO>();
        try {
            startSession();
            Query query=session.createQuery("from Subcategoria");
            List<Subcategoria> list = (ArrayList<Subcategoria>)query.list();
            for (Subcategoria subcategoriaO : list) {
                SubcategoriaDTO subcategoria=convertPojotoDTO(subcategoriaO);
                result.add(subcategoria);
            }
            transaction.commit();
            return result;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }

        @Override
    public SubcategoriaDTO findByIdSubcategoria(String idSubcategoria) throws InvoiceException {
        try {
            startSession();
            Query query=session.createQuery("from Articulos where idArt=:idArticulo").setParameter("idArticulo", idSubcategoria);
            Subcategoria subcategoria=(Subcategoria)query.uniqueResult();
            SubcategoriaDTO subcategoriaDTO=convertPojotoDTO(subcategoria);
            transaction.commit();
            return subcategoriaDTO;
        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        }finally{
            closeSession();
        }
    }
    

    @Override
    public List<SubcategoriaDTO> findSubcategByIdCategoria(Integer idCategoria) throws InvoiceException {
        List<SubcategoriaDTO> result = new ArrayList<SubcategoriaDTO>();
         
        try {
            startSession();
            Query query = session.createQuery("from Subcategoria where categoria.idCateg=:idCategoria").setParameter("idCategoria", idCategoria);
            List<Subcategoria> list = (ArrayList<Subcategoria>) query.list();
            SubcategoriaDTO subcategDTO;
            for (Subcategoria subcateg : list) {
                subcategDTO = (SubcategoriaDTO) convertPojotoDTO(subcateg);
                result.add(subcategDTO);
            }
            transaction.commit();
            return result;

        } catch (Exception e) {
            rollback();
            throw new InvoiceException("Error en busqueda", e);
        } finally {
            closeSession();
        }
    }       
}